package com.bookmanager.www.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bookmanager.www.common.DTO.AdvancedSearchDTO;
import com.bookmanager.www.entity.FlBook;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bookmanager.www.entity.FlBookHits;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 图书表 Mapper 接口
 * </p>
 *
 * @author 风离
 * @since 2021-09-17
 */
public interface FlBookMapper extends BaseMapper<FlBook> {

    /**
     * 获取所有图书信息
     * @return
     */
    List<FlBook> getAllBooks();

    /**
     * 获取某分类图书信息
     * @param categoriesId
     * @return
     */
    List<FlBook> getCategoriesBooks(@Param("categoriesId") int categoriesId);

    /**
     * 通过isbn插入图书信息
     * @param bookId
     * @param bookUpId
     * @param status
     * @param title
     * @param authorIntro
     * @param img
     * @param isbn
     * @param author
     * @param price
     * @param pages
     * @param doubanScore
     * @param douban
     * @param published
     * @param categoriesId
     * @param inventory
     * @param description
     * @param publishing
     * @param createdTimestamp
     * @param updatedTimestamp
     * @return
     */
    int insertBookByISBN(@Param("bookId") String bookId, @Param("bookUpId") String bookUpId,
                         @Param("status") int status, @Param("title") String title,
                         @Param("authorIntro") String authorIntro, @Param("img") String img,
                         @Param("isbn") String isbn, @Param("author") String author,
                         @Param("price") String price,@Param("pages") String pages,
                         @Param("doubanScore") String doubanScore,@Param("douban") String douban,
                         @Param("published") String published, @Param("categoriesId") int categoriesId,
                         @Param("inventory") int inventory, @Param("description") String description,
                         @Param("publishing") String publishing,
                         @Param("createdTimestamp") LocalDateTime createdTimestamp,
                         @Param("updatedTimestamp") LocalDateTime updatedTimestamp);

    /**
     * 通过isbn查询数据库中已有图书信息
     * @param isbn
     * @return
     */
    FlBook selectBookByISBN(@Param("isbn") String isbn);

    /**
     * 通过isbn查询数据库中轮播图大图
     * @param isbn
     * @return
     */
    String selectTopImgByISBN(@Param("isbn") String isbn);

    /**
     * 通过分类id删除该分类下所有图书
     * @param categoriesId
     * @return
     */
    int deleteBooksByCategoriesId(@Param("categoriesId") int categoriesId);

    /**
     * 通过分类id查询所有图书信息
     * @param categoriesId
     * @return
     */
    List<FlBook> selectBookByCategoriesId(@Param("categoriesId") int categoriesId);

    /**
     * 通过传入的图书名 模糊查询
     * @param bookName
     * @return
     */
    List<FlBook> searchBooksByBookName(@Param("bookName")String bookName);

    /**
     * 通过传入的出版社名 模糊查询
     * @param publishing
     * @return
     */
    List<FlBook> searchBooksByPublishing(@Param("publishing")String publishing);

    /**
     * 修复之前的Bug 修改所有价格显示为Double格式
     * @param temp
     * @param bookId
     * @return
     */
    int updatePriceById(@Param("price")String temp,@Param("bookId") String bookId);

    /**
     * 根据BookId查询图书信息
     * @param bookId
     * @return
     */
    FlBook selectBookByBookId(@Param("bookId")String bookId);

    /**
     * 根据图书编号和需要减少的库存数量来减少库存
     * @param bookId
     * @param count
     * @return
     */
    int reduceBooksStock(@Param("bookId")String bookId,@Param("count") Integer count);

    /**
     * 分类图书的分页
     * @param p
     * @param flBook
     * @param cid
     * @return
     */
    List<FlBook> selectPageExt(Page<FlBook> p, @Param("flBook") FlBook flBook,@Param("cid") Integer cid);

    /**
     * 获取分类图书信息 并根据豆瓣评分进行排行
     * @param categoriesId
     * @return
     */
    List<FlBook> getCategoriesBooksOrderByDoubanScoreDesc(@Param("cid")Integer categoriesId);

    /**
     * 零元购分页
     * @param p
     * @param flBook
     * @return
     */
    List<FlBook> selectPageExtZeroBuyBook(Page<FlBook> p,@Param("flBook")  FlBook flBook);


    /**
     * 根据bookId查找Hits
     * @param bookId
     * @return
     */
    FlBookHits selectHitsByBookId(@Param("book_id") String bookId);

    /**
     * 根据bookId更新缓存
     * @param bookId
     * @param count
     * @return
     */
    int updateHitsByBookId(@Param("book_id") String bookId,@Param("hits") int count);

    /**
     * 创建Book hit
     * @param isbn
     * @param i
     * @param createTime
     * @param updateTime
     * @param categoriesId
     * @param classifyId
     * @return
     */
    int createHitsByBookId(@Param("book_id")String isbn,
                           @Param("hits") int i,@Param("create_time") LocalDateTime createTime,
                           @Param("update_time") LocalDateTime updateTime,
                           @Param("categoriesId") Integer categoriesId,
                           @Param("classifyId") int classifyId);

    /**
     * 查询所有图书数量
     * @return
     */
    int selectBookCount();

    /**
     * selectDisableBookCount
     * @return
     */
    int selectDisableBookCount();

    /**
     * 改变图书库存
     * @param bookId
     * @param newStock
     * @return
     */
    int changeStockByBookId(@Param("bookId") String bookId,@Param("inventory") Integer newStock);

    /**
     * 批量改变图书上下架状态！
     * @param bookId
     * @param type
     * @return
     */
    int changeBookStatusByBookId(@Param("bookId") String bookId,@Param("status") Integer type);

    /**
     * 数据库高级搜索
     *
     * @param p
     * @param advancedSearchDTO
     * @return
     */
    List<FlBook> advancedSearch(Page<FlBook> p, @Param("advancedSearchDTO") AdvancedSearchDTO advancedSearchDTO);


    /**
     * 获取图书点击量
     * @param p
     * @return
     */
    List<FlBookHits> getBookHitsTop(Page<FlBookHits> p);

//    /**
//     * 更新图书库存
//     * @param isbn
//     * @param newInventory
//     * @return
//     */
//    int updateInventoryByISBN(@Param("bookId")String isbn, String newInventory);
}
